// HDU 1506. Largest Rectangle in a Histogram
// 该程序使用笛卡尔树求解直方图中最大矩形面积问题

#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
using ll = long long;  // 定义长整型别名，避免溢出

// 常量定义
constexpr int N = 100000 + 10;  // 最大节点数量，根据题目约束设置
constexpr int INF = 0x3f3f3f3f;  // 表示无穷大，用于初始化

// 笛卡尔树节点结构
struct node {
    int idx;        // 节点索引（直方图中的位置）
    int val;        // 节点值（直方图的高度）
    int par;        // 父节点索引
    int ch[2];      // 子节点索引，ch[0]为左子树，ch[1]为右子树

    // 重载小于运算符，用于节点比较（按索引排序）
    friend bool operator<(node a, node b) { return a.idx < b.idx; }

    // 初始化节点信息
    void init(int _idx, int _val, int _par) {
        idx = _idx, val = _val, par = _par;
        ch[0] = ch[1] = 0;  // 初始无子节点
    }
} tree[N];  // 树节点数组

// 全局变量
int root;       // 树根节点索引
int top;        // 栈顶指针（用于构建树）
int stk[N];     // 栈数组（用于构建树）
ll ans;         // 存储最大矩形面积的结果

// 构建笛卡尔树
// 功能：根据直方图高度构建满足小根堆性质的笛卡尔树
// 参数：n - 直方图的柱形数量
// 返回值：树根节点索引
int cartesian_build(int n) {
    // 从1到n遍历每个柱形
    for (int i = 1; i <= n; i++) {
        int k = i - 1;  // 初始父节点候选为前一个节点
        // 找到第一个值小于当前节点的祖先节点
        while (tree[k].val > tree[i].val)
            k = tree[k].par;
        // 将当前节点作为k的右子树
        tree[i].ch[0] = tree[k].ch[1];
        tree[k].ch[1] = i;
        tree[i].par = k;
        // 如果k原来有右子树，更新其父亲为当前节点
        if (tree[i].ch[0])
            tree[tree[i].ch[0]].par = i;
    }
    return tree[0].ch[1];  // 返回根节点
}

// 深度优先搜索计算最大矩形面积
// 参数：x - 当前节点索引
// 返回值：以x为根的子树大小
int dfs(int x) {
    if (!x) return 0;  // 空节点，子树大小为0
    // 递归计算左右子树大小
    int sz = dfs(tree[x].ch[0]);
    sz += dfs(tree[x].ch[1]);
    // 更新最大面积：当前节点高度 * (子树大小 + 1)
    ans = max(ans, (ll)(sz + 1) * tree[x].val);
    return sz + 1;  // 返回当前子树大小（包含当前节点）
}

int main() {
    // 优化输入输出
    cin.tie(nullptr)->sync_with_stdio(false);
    int n, hi;
    // 循环处理多组测试数据，直到n=0
    while (cin >> n, n) {
        // 初始化虚拟根节点（索引0）
        tree[0].init(0, 0, 0);
        // 读取每个柱形的高度并初始化节点
        for (int i = 1; i <= n; i++) {
            cin >> hi;
            tree[i].init(i, hi, 0);
        }
        // 构建笛卡尔树
        root = cartesian_build(n);
        // 初始化最大面积为0
        ans = 0;
        // 深度优先搜索计算最大面积
        dfs(root);
        // 输出结果
        cout << ans << '\n';
    }
    return 0;
}